查看原文
其他

《爱上潘大师》系列-与Series的初次相见

小一 小一的学习笔记 2023-01-01

2020,努力做一个无可替代的人!


作者 | 小一

全文共2400字,阅读全文需9分钟




写在前面的话

如果你是因为标题点进来的,那我得先解释一下

小一我可不是渣男,怎么会爱上别的人呢

Pandas,江湖人称“潘大师”,一手数据分析的技能让江湖人士爱慕不已。

当然,小一我也是潘大师的忠实粉丝,在MB级别的数据处理中也全靠潘大师才能够苟活到现在。


《爱上潘大师》系列,是Python 高阶部分的第二个系列

上一个系列也说过,NumPy 是Pandas 的基础,如果Pandas 有些问题你不是很理解,就去上一个系列看看基础,想必会对你有所帮助


上一个系列我根据文章主要内容重新列了标题

不要问我为什么重新列标题,我的眼眶好像又湿了......

NumPy 系列四篇文章,打好基础,再去研究Pandas 就会容易很多:

推荐看完《Hello NumPy》系列再来开荒 《Pandas 系列》


正文

Pandas,数据分析的重点库,基于NumPy构建,包含数据分析的高级数据结构和操作工具。

上面三个介绍应该很能说明问题,如果说NumPy 是一块生铁,那Pandas 就是一把生铁打造的利刃。


了解Pandas ,就得先了解它的数据结构。

不同于NumPy 的多维数组,Pandas 的主要数据结构是Series和DataFrame。

Series是一种类似于一维数组的对象,而DataFrame是一个表格型的数据结构,今天就主要介绍一下Series 相关。

Series 到底是什么样的?

Series 由一组数据以及一组与之相关的数据标签组成,其中数据可以是NumPy类型的各种数据,数据标签我们称之为索引。

说这么些,还不如直接举个例子,包你一眼就看明白

import pandas as pd
# 创建 Series
series_data1 = pd.Series([1245])

# 输出
0    1
1    2
2    4
3    5
dtype: int64

Series 是Pandas 的一种数据结构,所有我们可以直接通过 pd. 调用它

上面例子中,通过一维数组创建一个Series 数据,其中索引在左边,值在右边。

即左边的【0、1、2、3】是数据的索引,右边的【1、2、4、5】是数据值。

虽然我们没有为数据指定索引,但是Series 会自动创建一个0到N-1的整数型索引。


带索引的数据Series 数据如何创建?

知道你也有这个疑问,一起看一下吧

在创建的数据的时候,我们需要手动声明索引

# 创建带索引的数据
series_data2 = pd.Series([1245], index=['a''b''c''d'])

# 输出
a    1
b    2
c    4
d    5
dtype: int64

这就是Series 创建的方法,是不是很简单?


就这两种创建方式吗?NumPy 可是有好多种

有的有的,还可以通过字典创建 Series

# 通过字典创建Series
dict_data = {'a':1'b':2'c':4'd':5}
series_data3 = pd.Series(dict_data)

# 输出
a    1
b    2
c    4
d    5
dtype: int64

也可以通过字典和索引结合的方式创建 Series

这个时候,就以索引对应的数据为主了:索引能对应上数据,则数据存在,否则,数据为NaN

# 根据索引对应取值
index_data = ['a''b''c''new']
series_data4 = pd.Series(dict_data, index=index_data)

# 输出
a      1.0
b      2.0
c      4.0
new    NaN
dtype: float64

Series 的创建就这几种,一般创建 Series用到的不多,了解了解

Series 数据创建好了,访问的时候需要注意什么吗?

首先既然我们要访问数据,得先知道都有哪些访问方式

比如我们需要知道所有的值和索引,可以这样写

# 获取数据值
series_data2.values
# 输出
[1 2 4 5]

# 获取索引对象
series_data2.index
# 输出
Index(['a''b''c''d'], dtype='object')

既然可以访问索引,那索引可以修改吗?

对不起,不可以。

Index 对象不能更改,但是可以通过赋值索引实现这个目的

# 赋值索引
series_data2.index = ['new_a''new_b''new_c''new_d']
# 输出
Index(['new_a''new_b''new_c''new_d'], dtype='object')

至于说Series 的reindex 方法,先卖个关子,下节会说


通过下标去访问

例如我们需要查看第三个数据值以及对应的索引

# 查看第三个数据值
series_data2[2]
# 输出
4

# 查看第三个数据值对应的索引
series_data2.index[2]
# 输出
new_c

了解了,还有其他访问方式吗?

如果我们知道索引,当然也可以通过索引访问数据

# 通过索引访问数据
series_data2['new_c']
# 输出
4

# 通过多个索引访问数据
series_data2[['new_a''new_b''new_c']]
# 输出
new_a    1
new_b    2
new_c    4
dtype: int64

了解了访问方式,回想一下NumPy,Series之间可以进行相应的计算吗?

答案是肯定的。


先来看看 Series 的逻辑运算

# 输出大于2的Series 数据
series_data2[series_data2>2]

# 输出
new_c    4
new_d    5
dtype: int64

# c是否在索引中
'c' in series_data2
# 输出(因为已经改成 new_c了,所以是False)
False

在进行 in 运算时,可以将 Series看作是一个字典数据类型,索引和值是一一对应的。


再来看看 Series 的算术运算

举个例子:平方运算和开方运算

series_data2**2
# 输出
new_a     1
new_b     4
new_c    16
new_d    25
dtype: int64

np.sqrt(series_data2)
# 输出
new_a    1.000000
new_b    1.414214
new_c    2.000000
new_d    2.236068
dtype: float64

Series 还有一个最重要的功能:自动对齐

Series 会自动对齐不同索引的数据,特别是在算术运算符中


看个例子:不同索引的两个Series 数据相加

# 创建不同索引的两个Series
series_a = pd.Series([123], index=['a''b''c'])
series_b = pd.Series([222], index=['b''c''d'])

# 输出
a    1
b    2
c    3
dtype: int64
b    2
c    2
d    2
dtype: int64

# 相加
series_a + series_b
# 输出
a    NaN
b    4.0
c    5.0
d    NaN
dtype: float64

Series 会根据索引自动对齐数据,上面例子中两个Series 自动对齐 b、c 索引的数据 ,若无法对齐则会置为缺失数据

NaN:not a number 非数字


总结一下:

今天主要介绍了Pandas 的部分背景和Series 相关操作。

可能也不是很会写那种概念文,所以背景也就一两句话略过,大家就权当我说了很多,记住一点:NumPy 是基础,Pandas 是利器。

文中主要介绍了Series 的相关操作,稍微总结一下:

  1. Series 的创建方法

  2. Series 的访问操作

  3. Series 的相关运算

今天文章内容就这些,有问题欢迎留言,下节见

写在后面的话

如果说你错过了上个系列,那你一定不能错过这个系列

数据分析干货也不多,这个系列完了可能就会开始实战了

没跟上的同学自己加快进度,跟上的同学记得点击公众号选择设为星标,下节内容就不会错过了。

碎碎念一下

新的系列,小一我一直在努力,你们也要加油

感谢每篇文章帮我点“在看的你

公众号慢慢也有了一点广告收入,和之前投稿的赞赏一样,我都会全部拿出来。

之前投稿的赞赏也都全部用来支持原创作者了,钱也不多,只够喝杯咖啡的,但也是一份支持嘛

准备过段时间给你们抽几本书,毕竟有你们的支持我才能坚持下来。

如果有同学觉得自己学习坚持不下来,要不我们开个学习打卡的群?

只是一个想法,大家可以评论留言给我,如果人多的话我们就搞起来




好巧啊,你也读到这了!    

点个在看让我看到你

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存